'''
Description: 
Author: Zilu
Date: 2021-11-07 15:15:11
Version: 
LastEditTime: 2021-11-07 15:39:29
LastEditors: Zilu
'''

# 使用type函数可以查看类型
type(123)
type('abc')
type(None)

from inheritance_polymorphism import Animal
a = Animal()
type(Animal)
type(a)
type(abs)

# 要判断一个对象是否是函数，可以使用types模块中定义的常量
import types
def fn():
    pass

type(fn) == types.FunctionType
type(abs) == types.FunctionType
type(abs) == types.BuiltinFunctionType
type(lambda x:x*x) == types.LambdaType
type((i for i in range(10))) == types.GeneratorType

# 使用isinstance判断是否是某类的实例，或者是其子类的实例
from inheritance_polymorphism import Dog, Cat
d = Dog()
c = Cat()
isinstance(d, Dog)
isinstance(c, Cat)
isinstance(d, Animal)

# isinstance 还可以判断是否是某一系列类型中的一个
isinstance([1,2,3],(list,tuple))
isinstance(123,(float,str))

# 使用dir函数可以获得一个对象的所有属性和方法
dir('ABC')
dir(str)

# 类似__xxx__的属性和方法在Python中都是有特殊用途的，比如__len__方法返回长度。
# 在Python中，如果调用len()函数获取一个对象的长度，实际上，在len()函数内部，它自动去调用该对象的__len__()方法
# 所以我们希望使用len(MyObj)获取自己创造的类的长度时，可以在类中实现一个__len__()方法
class MyObj(object):
    def __len__(self):
        return 100

myObj = MyObj()
len(myObj)

# 可以用hasattr()、getattr()、setattr()获取一个对象的状态
class MyObject(object):
    def __init__(self) -> None:
        super().__init__()
        self.x = 9

    def power(self):
        return self.x ** 2

obj = MyObject()
hasattr(obj, 'x')
hasattr(obj, 'y')
hasattr(obj, 'power')
setattr(obj, 'y', 19)
hasattr(obj, 'y')
getattr(obj, 'z')
getattr(obj, 'z', 404)      # 可以返回一个默认值
fn = getattr(obj, 'power')
fn
fn()



